简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?

OC中使用引用计数方式进行内存管理,提供了ARC和MRC两种内存管理机制.
在MRC中,与retain配对使用的方法是release,因为retain是使引用计数加1,release是使引用计数减1.
与alloc配对使用的方法是dealloc,alloc是开辟内存空间,dealloc是销毁所开辟内存空间.

readwrite,readonly为读写性控制.
readwrite是告诉编译器既声明getter方法又声明setter方法.
readonly是告诉编译器只声明getter方法
默认属性为readwrite.

nonatomic,atomic为原子性控制
nonatomic为非原子性,此时setter,getter方法内部不会做多线程处理,可以提高系统性能.
atomic为原子性,此时setter,getter方法内部会做多线程处理,此时需要不断的对setter,getter加锁解锁来保证线程安全,但会很占用系统资源,降低系统性能.

在MRC下使用retain,assign,copy进行语义设置.
assign内部实现为直接赋值,如下:

.h
{
   NSInteger _age;
}
 - (void)setAge:(NSInteger)age;
 - (NSInteger)age;
.m
 - (void)setAge:(NSInteger)age{
    _age = age;
}
 - (NSInteger)age{
    return _age;
}

retain内部实现会做内存优化,如下:

.h
{
   NSString *_name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;

.m
- (void)setName:(NSString *)name{
    if(_name != name){
        [_name release];
        _name = [name retain];
    }
}

- (NSString *)name{
    return [[_name retain]autorelease];
}

copy是创建一个新对象,分深拷贝,浅拷贝两种,实现方式如下:

.h
{
    NSString *name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;

.m
- (void)setName:(NSString *)name{
    if(_name != name){
        [_name release];
        _name = [name copy];
    }
}
- (NSString *)name{
    return [[_name retain]autorelease];   
}

在ARC中使用strong,weak进行语义设置,strong相当于MRC中的retain,weak相当于MRC中的assign.


Baaaan
144 声望1 粉丝

我偏要勉强.